package middleware

import (
	"main/handlers"
	"net/http"
	"strings"

	"github.com/gin-gonic/gin"
)

// AlarmConfigGroup 结构体统一处理连接器请求
type AlarmConfigGroup struct {
	AlarmConfigGroupID           int    `json:"alarm_config_group_id"`                      // 连接器 ID（可选，更新或删除时需要）
	AlarmConfigGroupName         string `json:"alarm_config_group_name" binding:"required"` // 连接器名称（必填）
	ProjectID                    int    `json:"project_id" binding:"required"`              // 项目 ID（必填）
	AlarmConfigGroupUrl          string `json:"alarm_config_group_url"`                     // 连接地址（可选）
	AlarmConfigGroupToken        string `json:"alarm_config_group_token"`                   // token 信息（可选）
	AlarmConfigGroupTokenType    string `json:"alarm_config_group_token_type"`              // token 类型（可选）
	AlarmConfigGroupCronSchedule string `json:"alarm_config_group_cron_schedule"`           // 执行周期（可选）
	AlarmConfigGroupCode         string `json:"alarm_config_group_code"`                    // 执行类型（可选）
	AlarmConfigGroupInstruction  string `json:"alarm_config_group_instruction"`             // 备注（可选）
}

// GetProjects 处理获取连接器数据的请求
func GetController(c *gin.Context) {

	// 构建 SQL 查询
	query := `  
		SELECT * FROM alarm_config_group a 
		WHERE a.alarm_config_group_del != 1
	`
	// 执行查询
	results, err := handlers.ExecuteQuery(query)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Error executing query", "details": err.Error()})
		return
	}

	// 返回 JSON 响应
	c.JSON(http.StatusOK, results)
}

// PostController 处理新建连接器的请求
func PostController(c *gin.Context) {
	var alarmConfigGroup AlarmConfigGroup

	// 解析请求体中的 JSON 数据
	if err := c.ShouldBindJSON(&alarmConfigGroup); err != nil {
		// 请求体解析失败，返回 400 错误
		c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid data", "details": err.Error()})
		return
	}

	// 创建 SQL 插入语句
	insertsql := "INSERT INTO alarm_config_group (`alarm_config_group_name`, `project_id`, `alarm_config_group_url`, `alarm_config_group_token`, `alarm_config_group_token_type`, `alarm_config_group_cron_schedule`, `alarm_config_group_code`, `alarm_config_group_instruction`) VALUES (?, ?, ?, ?, ?, ?, ?, ?);"

	// 执行 SQL 插入操作
	_, err := handlers.ExecuteNonQuery(insertsql,
		alarmConfigGroup.AlarmConfigGroupName,         // 连接器名称
		alarmConfigGroup.ProjectID,                    // 归属项目ID
		alarmConfigGroup.AlarmConfigGroupUrl,          // 连接地址
		alarmConfigGroup.AlarmConfigGroupToken,        // token信息
		alarmConfigGroup.AlarmConfigGroupTokenType,    // token类型
		alarmConfigGroup.AlarmConfigGroupCronSchedule, // 执行周期
		alarmConfigGroup.AlarmConfigGroupCode,         // 执行类型
		alarmConfigGroup.AlarmConfigGroupInstruction)  // 备注

	if err != nil {
		// 如果执行 SQL 查询失败，返回 500 错误
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Error executing query", "details": err.Error()})
		return
	}

	// 返回成功响应
	c.JSON(http.StatusOK, gin.H{"message": "新建连接器成功"})
}

// PutController 处理更新连接器的请求
func PutController(c *gin.Context) {
	var alarmConfigGroup AlarmConfigGroup

	// 解析请求体中的 JSON 数据
	if err := c.ShouldBindJSON(&alarmConfigGroup); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid data", "details": err.Error()})
		return
	}

	// 校验 ID 是否存在
	if alarmConfigGroup.AlarmConfigGroupID == 0 {
		c.JSON(http.StatusBadRequest, gin.H{"error": "AlarmConfigGroup ID is required for updates"})
		return
	}

	// 创建 SQL 更新语句
	updateSQL := `
		UPDATE alarm_config_group
		SET alarm_config_group_name = ?, project_id = ?, alarm_config_group_url = ?, alarm_config_group_token = ?, 
			alarm_config_group_token_type = ?, alarm_config_group_cron_schedule = ?, alarm_config_group_code = ?, alarm_config_group_instruction = ?
		WHERE alarm_config_group_id = ?
	`

	// 执行 SQL 更新操作
	_, err := handlers.ExecuteNonQuery(updateSQL,
		alarmConfigGroup.AlarmConfigGroupName,
		alarmConfigGroup.ProjectID,
		alarmConfigGroup.AlarmConfigGroupUrl,
		alarmConfigGroup.AlarmConfigGroupToken,
		alarmConfigGroup.AlarmConfigGroupTokenType,
		alarmConfigGroup.AlarmConfigGroupCronSchedule,
		alarmConfigGroup.AlarmConfigGroupCode,
		alarmConfigGroup.AlarmConfigGroupInstruction,
		alarmConfigGroup.AlarmConfigGroupID,
	)

	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update alarm config group", "details": err.Error()})
		return
	}

	c.JSON(http.StatusOK, gin.H{"message": "Alarm config group updated successfully"})
}

// DeleteControllers 处理删除连接器的请求
func DeleteControllers(c *gin.Context) {
	var alarmConfigGroups []AlarmConfigGroup

	// 解析请求体中的 JSON 数据
	if err := c.ShouldBindJSON(&alarmConfigGroups); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid data", "details": err.Error()})
		return
	}

	// 收集需要删除的连接器 ID
	var alarmConfigGroupIDs []int
	for _, alarmConfigGroup := range alarmConfigGroups {
		if alarmConfigGroup.AlarmConfigGroupID == 0 {
			c.JSON(http.StatusBadRequest, gin.H{"error": "AlarmConfigGroup ID is required for deletion"})
			return
		}
		alarmConfigGroupIDs = append(alarmConfigGroupIDs, alarmConfigGroup.AlarmConfigGroupID)
	}

	// 构造 SQL 语句中的占位符
	placeholders := make([]string, len(alarmConfigGroupIDs))
	for i := range alarmConfigGroupIDs {
		placeholders[i] = "?"
	}

	// 拼接完整的 SQL 语句
	deleteSQL := `
		UPDATE alarm_config_group
		SET alarm_config_group_del = 1
		WHERE alarm_config_group_id IN (` + strings.Join(placeholders, ",") + `)
	`

	// 将 ID 展开成可变参数
	args := make([]interface{}, len(alarmConfigGroupIDs))
	for i, id := range alarmConfigGroupIDs {
		args[i] = id
	}

	// 执行 SQL 删除操作
	_, err := handlers.ExecuteNonQuery(deleteSQL, args...)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete alarm config groups", "details": err.Error()})
		return
	}

	c.JSON(http.StatusOK, gin.H{"message": "Alarm config groups deleted successfully"})
}
